#include "cryptage.h"
#include <string.h>

static void CESAR_main(const unsigned char c1, unsigned char *c2, const unsigned char *cle, short bool_c) {
/** Le faite d'avoir fait une fonction pour les deux (cryptage et décryptage) permet de modifier le code facilement pour les deux.
  *
  * Precondition : c1 un caractère, c2 un pointeur sur un caractère. cle non vide et bool_c indique si decryptage ou cryptage
  * Postconditon : c2 équivaut a c1 avec le decalage.
  */

    int i;
    int decalage = 0;
    int c;
    unsigned char res;

    res = c1;

    for(i = 0; i < strlen((char *)cle); i++) {

        decalage = decalage + cle[i];
    }

    if(bool_c == 1) { // On crypte

            c = (int) res;
            c = (c + decalage) % 256;
            res = (unsigned char) c;
    }
    else { //On décrypte

            c = (int) res;
            c = c - decalage;
            while(c < 0)
                c = c + 256; // pour rendre c positif mais en gardant le modulo 256
            c = c % 256;
            res = (unsigned char) c;
    }

    *c2 = res;
}

void CESAR_crypter(const unsigned char c_clair, unsigned char *c_chiffre, const unsigned char *cle) {

    CESAR_main(c_clair, c_chiffre, cle, 1);
}

void CESAR_decrypter(const unsigned char c_chiffre, unsigned char *c_clair, const unsigned char *cle) {

    CESAR_main(c_chiffre, c_clair, cle, 0);
}
